#pragma once
#include <iostream>
#include <pthread.h>
#include <functional>
#include <string>
#include <unistd.h>
#include <vector>
#include"Log.hpp"
// 线程库模块
namespace pthread_moudle
{
    using func_t = std::function<void(std::string)>;

    class Thread
    {
    public:
        Thread(func_t func, std::string name)
            : _func(func), _name(name), _stop(false),_cnt(0)
        {
        }

        // 执行功能函数
        void excute()
        {
            _func(_name);
        }

        static void *thread_rountine(void *args)
        {
            Thread *selfthread = static_cast<Thread*>(args); // 将args显式强转为线程类型
            selfthread->excute();
            return nullptr;
        }
        
        // 启动线程，并返回启动结果
        bool start()
        {
            int n = pthread_create(&_tid, nullptr, thread_rountine, this); // 创建线程，线程函数为thread_routine,传入*this，
            if (n == 0)
            {
                _stop = false;
                //Log(DEBUG,"%s is start success!",_name.c_str());
                //std::cout<<_name<<std::endl;
               // std::cout << _name << "start success...." << std::endl;
                return true;
            }
            else
            {
                std::cout << "start fail" << std::endl;
                return false;
            }
        }

        // 非静态成员函数会默认传入this，但线程函数只有一个参数
        // 同时，静态成员函数无法直接访问对象成员，需要传入

        void detach()
        {
            if (!_stop)
            {
                pthread_detach(_tid);
            }
        }
        // 等待进程
        void join()
        {
            if (!_stop)
            {
                pthread_join(_tid, nullptr);
                Log(DEBUG,"%s join success...",_name.c_str());
                // std::cout<<_name<<" join success..."<<std::endl;
            }
               
        }

        int& cnt()
        {
            return _cnt;
        }
        ~Thread()
        {
        }

    private:
        pthread_t _tid;    // 线程的tid
        int _cnt;
        std::string _name; // 线程的名字
        bool _stop;        // 线程的运行状态
        func_t _func;   // 线程函数调用的函数，线程最终执行的功能函数
    };
}
